package main

import "fmt"

/**
	1.Slice，半开半闭
	2.Slice本身没有数据，是对底层array的一个view
	3.Slice可以向后扩展，不可以向前扩展,s[i]不可以超越len(s),向后扩展不可以超越底层数据cap(s)
	4.添加元素时，如果超越cap,系统会重新分配一个更大的底层数据，由于值传递的关系，必须接受append的返回值
 */
func updateSlice(s []int) {
	s[2] = 10
}

func main() {

	arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
	fmt.Println("array [2:6]", arr[2:6])
	fmt.Println("array [:6]", arr[:6])

	s1 := arr[2:]

	fmt.Println("s1", s1)

	s2 := arr[:]

	updateSlice(s2[:])

	fmt.Println("s2", s2)
	fmt.Println("arr", arr)

	fmt.Println("Reslice")
	fmt.Println("s2 = ", s2)
	s2 = s2[:5]
	fmt.Println("Reslice s2[:5] = ", s2)
	s2 = s2[2:]
	fmt.Println("Reslice s2[2:] =", s2)
	s2[0] = 1
	fmt.Println("arr", arr)

	fmt.Println("Extending slice")
	arr[0], arr[2] = 0, 2
	fmt.Println("arr=", arr)
	s1 = arr[2:6]
	s2 = s1[3:5] // s1[3] , s1[4]
	fmt.Printf("s1 = %v, len(s1)=%d, cap(s1)=%d \n",
		s1, len(s1), cap(s1))
	fmt.Printf("s2 = %v, len(s2)=%d, cap(s2)=%d \n",
		s2, len(s2), cap(s2))
	//fmt.Println("s1 extending",s1[3:])

	s3 := append(s2, 10)
	s4 := append(s3, 11)
	s5 := append(s4, 12)
	fmt.Println("s3,s4,s5", s3, s4, s5)
	//s4 and s5 no longer view arr,append会产生一个新的Array(系统会分配一个更加长的Array)
	fmt.Println("arr = ", arr)
}
